\section{Introduction}

While most \cl{} implementations have their own native \clos{}
implementation, PCL \cite{Bobrow:1986:CML:28697.28700} is still used
in some high-performance implementations, notably \sbcl{}.  PCL was
written so that \clos{} could be added to a pre-\clos{} Common Lisp
implementation such as the one defined in CLtL \cite{Steele:1984:CLL}
without too much effort.  Even \cl{} implementations that do not use
PCL (such as ECL) include \clos{} late in the process of building a
complete system.

\sicl{}\footnote{https://github.com/robert-strandh/SICL} takes a
different approach.  With very few exceptions, \sicl{} is written in
entirely standard \cl{}, and it is designed to be bootstrapped using a
conforming \cl{} implementation, which therefore includes a complete
implementation of \clos{}.  \sicl{} takes advantage of the conforming
host by making extensive use of \clos{}.  In particular, \clos{} is
bootstrapped \emph{first}, using the host \clos{} implementation to
break circularity in definitions. 

The \sicl{} implementation of \clos{} is a truly metacircular
implementation in that very few compromises are necessary because of
bootstrapping or metastability issues.

Since \clos{} is defined as a \clos{} program, there are necessarily
metacircular issues that need to be resolved.  The AMOP
\cite{Kiczales:1991:AMP:574212} divides these issues into two
families:

\begin{itemize}
\item Bootstrapping issues.  The canonical example mentioned in the
  AMOP is that the class \texttt{standard-class} is its own metaclass,
  so it must exist before it is created.  
\item Metastability issues.  Here, the canonical example is the
  function \texttt{compute-discriminating-function} being invoked on
  itself as a result of a method being added to it.
\end{itemize}

As mentioned in the AMOP, bootstrapping issues are relatively easy to
resolve, because there is only a relatively small number of them, and
they can be handled by writing special-case code.  So for instance,
the class \texttt{standard-class} can be defined ``by hand'' without
using \texttt{defclass}. 

Metastability issues are more difficult to handle because they may
require special cases to be handled at runtime so as to avoid infinite
computation.  

Notice, however, that the canonical example for the
metastability family issues is not a problem \emph{per se}.  Calling
\texttt{compute-discriminating-function} on itself is a problem only
if the \emph{existing} discriminating function of
\texttt{compute-discriminating-function} is unable to compute the
discriminating function of a standard generic function%
\footnote{\texttt{compute-discriminating-function} is a standard
  generic function.}, and whether it can do so depends on the structure
of the code.

The technique described in this paper, \emph{satiation}, guarantees
that existing discriminating functions of specified%
\footnote{The term \emph{specified} is used as in the AMOP to mean
  an object (such as a class, a generic function, or a method) that is
  defined by the \hs{} or the AMOP.}
generic functions can handle arguments of all specified classes.
